package demo01;

import java.io.FileNotFoundException;
import java.io.IOException;

/*
 *  异常处理的第二种方式：
 *  try...catch：手动接收并处理异常
 *  使用格式：
 *      try {
 *          // 可能存在异常的代码块
 *      } catch (异常类名1 e) {
 *          // 处理异常1的代码块
 *      } catch (异常类名2 e) {
 *          // 处理异常2的代码块
 *      } ... catch (异常类名n e) {
 *          // 处理异常n的代码块
 *      }
 *  注意事项：
 *      1. try的代码块中可能抛出多种异常，可以使用多个catch来处理多种异常对象
 *      2. 如果try中产生异常，就会执行对应异常的catch的异常处理逻辑，执行完毕后会执行try...catch之后的代码
 *      3. 如果try中没有产生异常，就不会执行任何catch的异常处理逻辑，执行完try的代码后会执行try...catch之后的代码
 *      4. 捕获多种异常时，如果异常存在父子类关系，那么编写捕获语句时子类异常在前，父类异常在后，否则会执行不到捕获子类异常的代码，产生报错
 *  Throwable类中获取异常信息的三种方法：
 *      public String getMessage()：获取异常的描述信息
 *      public String toString()：获取异常的类型和异常的描述信息
 *      public void printStackTrace()：打印异常的类型、异常的描述信息和异常出现的位置
 */
public class Demo06TryCatch {
    public static void main(String[] args) {
        try {
            readFile("c:\\a.txd");
            /*
             *  FileNotFoundException是IOException的子类
             *  捕获异常时，catch子类异常要写在catch父类异常之前，否则会捕获不到子类异常，产生报错
             */
        } catch (FileNotFoundException e) { // 先捕获FileNotFoundException未找到文件异常
            /*
             *  public String getMessage()：获取异常的描述信息
             *  public String toString()：获取异常的类型和异常的描述信息
             */
            System.out.println(e.getMessage()); // 文件路径不在c盘，请传递c盘下的文件
            System.out.println(e.toString()); // java.io.FileNotFoundException: 文件路径不在c盘，请传递c盘下的文件
            System.out.println(e); // 与使用方法toString的结果相同
        } catch (IOException e) { // 后捕获IOExceptionIO流异常
            /*
             *  public void printStackTrace()：打印异常的类型、异常的描述信息和异常出现的位置
             */
            e.printStackTrace();
            /*  java.io.IOException: 文件的后缀名不对，请传递txt文件
                    at demo01.Demo06TryCatch.readFile(Demo06TryCatch.java:43)
                    at demo01.Demo06TryCatch.main(Demo06TryCatch.java:27) */
        }

        System.out.println("文件读取结束");
    }

    private static void readFile(String filename) throws IOException {
        if (!(filename.charAt(0) == 'c' || filename.charAt(0) == 'C')) {
            throw new FileNotFoundException("文件路径不在c盘，请传递c盘下的文件");
        }
        if(!filename.endsWith(".txt")) {
            throw new IOException("文件的后缀名不对，请传递txt文件");
        }
        System.out.println("文件读取成功");
    }
}
